# 介绍

传统 Echo 模型:

  1. Java 客户端:键盘输入 -> 发送数据 -> Java 服务端
  2. Java 服务端:接收数据 -> 处理数据 -> 发送数据 -> Java 客户端
  3. Java 客户端:接收数据

字符流

# 样例代码

# EchoServer

class HandlerThread implements Runnable {
    private Socket client;

    public HandlerThread(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        try {
            PrintStream output = new PrintStream(client.getOutputStream());
            Scanner scanner = new Scanner(client.getInputStream());
            scanner.useDelimiter("\n");
            while (true) {
                if (scanner.hasNext()) {
                    // 注意不能漏掉 trim,因为最后还要一个换行符
                    String value = scanner.next().trim();
                    if ("bye".equalsIgnoreCase(value)) {
                        // 结束交互
                        output.println("[Echo] See you!");
                        break;
                    } else {
                        output.println("[Echo] " + value);
                    }
                }
            }
            client.close();
        } catch (Exception e) {}
    }
}


public class EchoServer {
    public static void main(String[] args) throws Exception{
        try (ServerSocket server = new ServerSocket(9090)) {
            while (true) {
                Socket client = server.accept();
                System.out.println("New connection established successfully!");
                new Thread(new HandlerThread(client)).start();
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# EchoClient

public class EchoClient {
    static KeyboardInputReader keyboard = new KeyboardInputReader();

    public static void main(String[] args) throws Exception {
        try (Socket socket = new Socket(InetAddress.getLocalHost(), 9090)) {
            PrintStream output = new PrintStream(socket.getOutputStream());
            Scanner scanner = new Scanner(socket.getInputStream());
            scanner.useDelimiter("\n");
            while (true) {
                String value = 
                    keyboard.getStringNotNull("Please input data to be sent: ");
                output.println(value);
                if (scanner.hasNext()) {
                    System.err.println(scanner.next().trim());
                }
                if ("bye".equalsIgnoreCase(value)) {
                    break;
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Last Updated: 7/4/2020, 2:38:24 PM